
package com.microboot.service;

import com.alibaba.fastjson2.JSON;
import com.microboot.interceptor.ClientLoginInterceptor;
import com.microboot.wsdl2java.weather.WeatherWebServiceSoap;
import lombok.extern.slf4j.Slf4j;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 天气WebService服务类
 */
@Slf4j
@Service
public class WeatherWebService {

    /**
     * 获取支持城市列表
     * 补充说明： 调用第三方是.net语言的webservice会报：undefined element declaration 's:schema' 错误，
     * 建议使用readme步骤中的方案下载本地后替换标签，再生成代码方式解决,参考下方代码： getWsdl2JavaSupportCity()
     * @return 城市列表
     */
    public List<String> getSupportCity() {

        //WebService服务地址
        String address = "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl";
        //创建动态客户端工厂
        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
        //创建客户端
        Client client = dcf.createClient(address);
        //添加客户端登录拦截器，设置认证账户信息
        client.getOutInterceptors().add(new ClientLoginInterceptor("longxian","root123"));
        //调用WebService服务，获取支持的城市列表
        Object[] result = null;
        try {
            result = client.invoke("getSupportCity", "广东");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        //日志记录调用结果
        log.info("调用 WeatherWebService ==>> getSupportCity 服务接口返回数据信息为：{}", JSON.toJSONString(result));

        //处理返回结果，转换为城市列表
        List<String> cityList = null;
        if(null != result && result.length > 0){
            if(result[0] instanceof List){
                cityList = (List<String>) result[0];
            } else {
                //如果返回结果类型不匹配，记录错误日志
                log.error("调用 WeatherWebService ==>> getSupportCity 服务接口响应对象类型不匹配，对象：{}", result[0]);
            }
        }

        return cityList;
    }

    /**
     * 使用本地生成的wsdl代码获取支持的城市列表
     * @return 城市列表
     */
    public List<String> getWsdl2JavaSupportCity() {

        //创建WeatherWebService服务实例
        com.microboot.wsdl2java.weather.WeatherWebService service = new com.microboot.wsdl2java.weather.WeatherWebService();
        //获取WeatherWebServiceSoap对象，用于调用WebService方法
        WeatherWebServiceSoap weatherWebServiceSoap = service.getWeatherWebServiceSoap();
        //调用getSupportProvince方法获取省份列表
        List<String> provinceList = weatherWebServiceSoap.getSupportProvince().getString();
        //日志记录省份列表
        log.info(JSON.toJSONString(provinceList));

        //调用getSupportCity方法获取广东省的城市列表
        List<String> gdProvList = weatherWebServiceSoap.getSupportCity("广东").getString();
        //日志记录城市列表
        log.info(JSON.toJSONString(gdProvList));

        return gdProvList;
    }

}